#include"add.h"

int main()
{
    //创建共享内存
    key_t key = getkey();//生成key值
    cout<<"生成的key = "<<key<<endl;
    int shmid = creatshm(key);

    //挂接共享内存
    cout<<"开始将共享内存映射到进程地址空间当中"<<endl;
    cout<<"shmid = "<<shmid<<endl;
    char* start = (char*)shmatway(shmid);
    //printf("%p\n",start);
    sleep(3);//进程结束以后，页表销毁，挂接关系消失

    //创建管道--提供同步机制
    creat_pipe(path);
    cout<<"创建管道"<<endl;
    int fd = open(path.c_str(),O_RDONLY);//同步机制会等待另一方也打开管道才会继续向下执行
    cout<<"打开管道"<<endl;

    //通信(创建共享内存--先运行--读数据)
    while(1)
    {
        int tmp;
        ssize_t r = read(fd, &tmp, sizeof(tmp));
        if(r==0)
        {
            break;//写端已经关闭
        }
        cout<<"共享内存的数据："<<start<<endl;
        //共享内存不提供同步机制
    }

    //取消挂接和关闭管道删除管道
    shmdt(start);
    close(fd);
    unlink(path.c_str());

    //控制(清除)共享内存
    cout<<"开始将共享内存从操作系统中删除"<<endl;

    struct shmid_ds ds;
    shmctl(shmid,IPC_STAT,&ds);
    cout<<"共享内存中的key = "<<ds.shm_perm.__key<<endl;

    shmctl(shmid,IPC_RMID,nullptr);

}
